package com.itheima.d4_proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.net.Proxy;

import static java.lang.reflect.Proxy.newProxyInstance;

//中介公司
public class ProxyUtil {
    //创建代理对象

    /* newProxyInstance(ClassLoader loader,
               Class<?>[] interfaces,
               InvocationHandler h)
               参数1：用于指定一个类加载器
               参数2：指定生成的代理长什么样子，也就是有哪些方法
               参数3：用来指定生成的代理对象要干什么事情
               */
    // Star starProxy = ProxyUtil.createProxy(s);
    // starProxy.sing("好日子") starProxy.dance()
    public static StarService createProxy(Star s){
        //创建代理对象 newProxyInstance
        StarService proxy = (StarService) newProxyInstance(
                //参数1：用于指定一个类加载器
                ProxyUtil.class.getClassLoader(),
                //参数2：指定生成的代理长什么样子，也就是有哪些方法
                s.getClass().getInterfaces(),
                //参数3：用来指定生成的代理对象要干什么事情
                new InvocationHandler() {
                    //参数一：proxy接收到代理对象本身（暂时用处不大）
                    //参数二：method代表正在被代理的方法
                    //参数三：args代表正在被代理的方法的参数
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        if("sing".equals(method.getName())){
                            System.out.println("准备话筒，收钱");
                        }else if("dance".equals(method.getName())){
                            System.out.println("准备场地，收钱");
                        }
                        //真正干活（把明星对象叫过来干活）
                        Object result = method.invoke(s, args);
                        return result;
                    }
                }
        );
        return proxy;
    }
}
